import { Sendable, MessageElem } from 'oicq'
import { MessageEvent } from '../../types'

export interface ICommand {
    /**
     * 命令名称
     */
    name: string
    /**
     * 命令参数
     */
    params: string[]
}

/**
 * 消息发送者
 */
export class Sender {
    /**
     * 消息对象
     */
    public _msgEvent: MessageEvent
    /**
     * 是否是管理员
     */
    public isAdmin: boolean
    /**
     * 文本消息
     */
    public text: string
    /**
     * 完整消息
     */
    public message: MessageElem[]
    /**
     * 用户id
     */
    public userId: number
    /**
     * 昵称
     */
    public nickname: string
    /**
     * 命令
     */
    public command: ICommand | null = null
    /**
     *
     * @param e 消息事件
     * @param adminQQ 管理员QQ号
     */
    constructor(e: MessageEvent, adminQQ?: number) {
        this._msgEvent = e
        this.userId = e.sender.user_id
        this.isAdmin = this.userId === adminQQ
        this.text = e.raw_message
        this.message = e.message
        this.nickname = e.sender.nickname
        // 解析命令
        this.command = resolveCommand(this.text)
    }

    /**
     * 回复消息
     * @param content 回复内容
     * @param quote 是否引用消息
     */
    public reply(content: Sendable, quote = false) {
        this._msgEvent.reply(content, quote)
    }
}

/**
 * 解析消息中的文本内容
 * @param text 消息中的文本内容
 */
export function resolveCommand(text: string): ICommand | null {
    // 所有命令都以/开头
    if (!text.startsWith('/')) return null

    const [name, ...params] = text.split(/ +/)
    return {
        name,
        params,
    }
}
